Skip to content

Conversation

@linxianxi
Copy link
Contributor

@linxianxi linxianxi commented Apr 8, 2024

原先内部 onColumnResize 重命名为 onColumnWidthChange,进行区分

Summary by CodeRabbit

  • 新功能

    • 表格列支持可调整宽度(resizable),表头可拖拽调整,支持最小宽度与方向适配;新增列宽调整完成回调以获取被调整列及所有列的最新宽度,调整状态在表格上有视觉指示。
    • 示例改为基于 Hooks 的演示,包含 RTL 切换与内置列调整演示。
  • 样式

    • 增加拖拽手柄与调整指示线样式,优化固定列阴影的交互体验(阻止遮挡交互)。
  • 文档

    • 更新 README,新增 resizable 属性说明。
  • 测试

    • 添加列宽调整行为测试,覆盖宽度变化、最小宽度约束与回调验证。
  • 其它

    • 移除外部列调整依赖,示例和实现采用内置方案。

✏️ Tip: You can customize this high-level summary in your review settings.

@vercel
Copy link

vercel bot commented Apr 8, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
table ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 29, 2025 3:28am

@zombieJ
Copy link
Member

zombieJ commented Apr 23, 2024

体验有点怪异,如果是超出 width 的时候缩小应该就是缩小,不应该把右边的撑开才对。

@zombieJ
Copy link
Member

zombieJ commented May 10, 2024

看起来好像没对齐

截屏2024-05-10 13 56 36

@XuJin186
Copy link

waiting for it😊

3 similar comments
@ChengYiWu
Copy link

waiting for it😊

@XuJin186
Copy link

waiting for it😊

@XuJin186
Copy link

waiting for it😊

@ilxqx
Copy link

ilxqx commented Jul 31, 2025

waiting for it

1 similar comment
@XuJin186
Copy link

waiting for it

@AmirrezaAsadpour
Copy link

waiting for it😊

1 similar comment
@AmirrezaAsadpour
Copy link

waiting for it😊

@phobal
Copy link

phobal commented Aug 20, 2025

waiting for it,Please merge it

@ilxqx
Copy link

ilxqx commented Aug 21, 2025

antd v6 有没有可能 table 组件基于 TanStack Table 重构呢?我感觉 tanstack table 作为 table 引擎,数据逻辑层面的东西都封装好了,我们只需要基于它做一层很薄的封装即可,剩下的就是样式问题了,而且引入它也不存在依赖剧增的情况(说实话 antd 整个包也不小了),当然这是只是建议,具体看官方怎么决断

@li-jia-nan
Copy link
Member

antd v6 有没有可能 table 组件基于 TanStack Table 重构呢?我感觉 tanstack table 作为 table 引擎,数据逻辑层面的东西都封装好了,我们只需要基于它做一层很薄的封装即可,剩下的就是样式问题了,而且引入它也不存在依赖剧增的情况(说实话 antd 整个包也不小了),当然这是只是建议,具体看官方怎么决断

用 TanStack Table 不太可能,但是 rc-table 这个库之前有重构的计划,具体看 @zombieJ 有没有时间了

@AmirrezaAsadpour
Copy link

waiting for it,Please merge it

2 similar comments
@XuJin186
Copy link

waiting for it,Please merge it

@AmirrezaAsadpour
Copy link

waiting for it,Please merge it

Added optional 'title' prop to MeasureCell component.
Refactor MeasureRow component to use props instead of destructuring in the function signature.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/Table.tsx (1)

140-144: 对外 API onColumnResizeEnd 的命名与结构建议

命名与内部 colsWidths/colWidths 存在不一致;建议统一术语,避免 columnWidths vs colWidths 混用。同时,为提升查询效率与可读性,考虑将 columnWidths 从数组改为 Record/Map(O(1) 查找),或并行提供两种形式。

🧹 Nitpick comments (5)
src/interface.ts (2)

66-66: 建议为 scrollbar 属性添加文档说明。

scrollbar 属性缺少 JSDoc 注释,建议补充说明其用途和使用场景,例如是否用于标识虚拟滚动条列。这将有助于其他开发者理解该属性的作用。

可以考虑添加类似如下的文档:

   className?: string;
   style?: React.CSSProperties;
   children?: React.ReactNode;
+  /** Column configuration with optional scrollbar metadata */
   column?: ColumnsType<RecordType>[number] & { scrollbar?: boolean };
   colSpan?: number;
   rowSpan?: number;

130-130: 建议为 resizable 属性添加详细文档。

resizable 属性作为列宽调整功能的核心 API,建议添加 JSDoc 注释说明:

  • 该属性的作用(是否允许用户拖拽调整列宽)
  • 默认值(未设置时的行为)
  • 与其他属性的交互(如 widthminWidth 等)

这将帮助用户更好地理解和使用该功能。

可以考虑添加类似如下的文档:

   rowSpan?: number;
   width?: number | string;
   minWidth?: number;
+  /** Whether the column can be resized by dragging. Defaults to false. */
   resizable?: boolean;
   onCell?: GetComponentProps<RecordType>;
src/context/TableContext.tsx (1)

64-66: 回调重命名合理,但需处理旧字段歧义与文档说明

  • onColumnWidthChange 命名清晰,但同时保留 colWidths(数组)与新增 colsWidths(Map)/colsKeys 会造成概念重复与状态分裂风险。建议标注 colWidths 为废弃,指引改用新组合。
  • 建议为回调补充最小文档(单位/裁剪规则),避免二义性。

可考虑如下微调(仅类型注释与废弃标记):

-  onColumnWidthChange: (columnKey: React.Key, width: number) => void;
+  /** width 单位:px;应为已按 minWidth/maxWidth 约束后的值 */
+  onColumnWidthChange: (columnKey: React.Key, width: number) => void;

-  colWidths: number[];
+  /** @deprecated 请改用 colsWidths + colsKeys;后续将移除 */
+  colWidths: number[];
src/Table.tsx (2)

392-396: useMemo 依赖使用 join 带来不必要开销与潜在碰撞

pureColsKeys.join('_') 每次 render 做 O(n) 字符串拼接,且当 key 含下划线可能造成误判。这里 colsKeys 仅回传 pureColsKeys 本身,useMemo 意义有限。建议简化:

- const pureColsKeys = getColumnsKey(flattenColumns);
- const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys.join('_')]);
+ const pureColsKeys = getColumnsKey(flattenColumns);
+ // 直接使用或以引用为依赖即可
+ const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys]);
+ // 或:const colsKeys = pureColsKeys;

447-450: 为 onColumnWidthChange 增加输入健壮性(NaN/负值/无穷)

拖拽过程中可能产生异常宽度,建议在入口处校验,避免状态抖动与布局异常。

- const onColumnWidthChange = React.useCallback((columnKey: React.Key, width: number) => {
+ const onColumnWidthChange = React.useCallback((columnKey: React.Key, width: number) => {
+   if (!Number.isFinite(width) || width < 0) {
+     return;
+   }
    updateColsWidths(widths => {
      if (widths.get(columnKey) !== width) {
        const newWidths = new Map(widths);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1cb8e69 and 66f1c8f.

📒 Files selected for processing (12)
  • README.md (1 hunks)
  • assets/index.less (3 hunks)
  • package.json (0 hunks)
  • src/Body/MeasureCell.tsx (1 hunks)
  • src/Body/MeasureRow.tsx (3 hunks)
  • src/Body/index.tsx (3 hunks)
  • src/FixedHolder/index.tsx (1 hunks)
  • src/Header/HeaderRow.tsx (3 hunks)
  • src/Table.tsx (9 hunks)
  • src/VirtualTable/BodyGrid.tsx (3 hunks)
  • src/context/TableContext.tsx (2 hunks)
  • src/interface.ts (2 hunks)
💤 Files with no reviewable changes (1)
  • package.json
🚧 Files skipped from review as they are similar to previous changes (7)
  • src/Body/index.tsx
  • src/FixedHolder/index.tsx
  • src/Body/MeasureCell.tsx
  • src/Header/HeaderRow.tsx
  • assets/index.less
  • src/VirtualTable/BodyGrid.tsx
  • README.md
🔇 Additional comments (8)
src/Body/MeasureRow.tsx (1)

11-11: LGTM!属性重命名一致且清晰

onColumnResize 重命名为 onColumnWidthChange 在整个文件中应用一致(接口定义、解构、回调调用和属性传递),有助于区分职责并提高代码清晰度。

Also applies to: 18-18, 30-30, 45-45

src/context/TableContext.tsx (1)

78-86: fullTableRef 类型不空安全;建议使用只读集合类型暴露上下文以避免误改

  • fullTableRef 目前为 MutableRefObject,常规 useRef(null) 初始为 null,类型不匹配且可能导致非空断言滥用。应改为 MutableRefObject<HTMLDivElement | null>。
  • 上下文中暴露的 Map/数组若被外部原地修改,会引发不可预期的共享可变状态。建议使用 ReadonlyMap 与 readonly 数组。
  • onColumnResizeEnd 的 columnWidths 可设为 ReadonlyArray 以保持一致的只读语义。

请考虑如下类型调整:

-  fullTableRef: React.MutableRefObject<HTMLDivElement>;
-  colsWidths: Map<React.Key, number>;
-  colsKeys: React.Key[];
+  fullTableRef: React.MutableRefObject<HTMLDivElement | null>;
+  colsWidths: ReadonlyMap<React.Key, number>;
+  colsKeys: readonly React.Key[];

-  onColumnResizeEnd?: (info: {
-    columnKey: React.Key;
-    width: number;
-    columnWidths: { columnKey: React.Key; width: number }[];
-  }) => void;
+  onColumnResizeEnd?: (info: {
+    columnKey: React.Key;
+    width: number;
+    columnWidths: ReadonlyArray<{ columnKey: React.Key; width: number }>;
+  }) => void;

可用脚本快速核查影响面与遗留命名:

src/Table.tsx (6)

242-242: 解构追加 onColumnResizeEnd:OK

按预期将对外回调贯通到组件内部。


837-837: 正在拖拽态 className:OK

新增 ${prefixCls}-column-resizing 有利于样式与交互隔离。


914-914: 向下传递 onColumnWidthChange:OK

命名与职责清晰,便于区分变化与结束事件。


929-934: 上下文扩展:OK,但建议确认重置时机

onResizingChange: setIsResizing 贯通合理。请确保在拖拽取消/组件卸载时回落为 false,避免残留“正在拖拽”的 UI 状态。


950-950: 依赖中加入 fullTableRef:OK

Ref 对象本身稳定,加入依赖通常不必要;若为满足 lint 要求可保留。


974-980: 对象字面量重复传入 colWidths,后者会覆盖前者(功能风险)

在同一对象中出现两次 colWidths,会导致前一处值被覆盖,可能引入难排查的行为差异。请移除重复项。

       onColumnWidthChange,
       colsWidths,
       colsKeys,
-      colWidths,
       onColumnResizeEnd,
       setIsResizing,
-      colWidths,
+      colWidths,

另:此处使用 setIsResizing,而其它位置通过 onResizingChange 命名传递,建议统一命名以降低心智负担。

Also applies to: 980-980

@AmirrezaAsadpour
Copy link

waiting for it,Please merge it

1 similar comment
@XuJin186
Copy link

waiting for it,Please merge it

@lyj-514328
Copy link

waiting for it,Please merge it

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
src/VirtualTable/BodyGrid.tsx (1)

24-42: useEffect 依赖中补充 onColumnWidthChange,避免闭包过期

这里的 effect 目前只依赖 columnsWidth,如果未来 TableContext 中的 onColumnWidthChange 被替换(例如内部 hooks 或 refactor),effect 不会重新执行,会继续使用旧回调,也会触发 hooks lint 警告。建议把它一并放进依赖数组:

-  React.useEffect(() => {
-    columnsWidth.forEach(([key, width]) => {
-      onColumnWidthChange(key, width);
-    });
-  }, [columnsWidth]);
+  React.useEffect(() => {
+    columnsWidth.forEach(([key, width]) => {
+      onColumnWidthChange(key, width);
+    });
+  }, [columnsWidth, onColumnWidthChange]);

当前实现因为回调本身是稳定的不会立刻出 bug,但按 hooks 规范补齐依赖会更安全一些。

Also applies to: 73-77

src/Table.tsx (2)

391-399: 列宽度追踪逻辑整体 OK,但 join('_') 依赖写法可以更直观一些

Map<React.Key, number>colsWidths,再按 colsKeys 映射出 colWidths 并通过 useMemo 保持引用稳定,这个思路是合理的,也有利于减少下游 useMemo/useEffect 的无效重算。

不过当前用 pureColsKeys.join('_') / pureColWidths.join('_') 作为依赖 key 的写法可读性略差,而且存在极小概率的拼接冲突(例如特殊字符串 key)。可以考虑用更直接的写法来表达“当列定义或宽度数组实际变化时才更新”,例如:

-  const pureColsKeys = getColumnsKey(flattenColumns);
-  const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys.join('_')]);
-  const pureColWidths = colsKeys.map(columnKey => colsWidths.get(columnKey));
-  const colWidths = React.useMemo(() => pureColWidths, [pureColWidths.join('_')]);
+  const colsKeys = React.useMemo(
+    () => getColumnsKey(flattenColumns),
+    [flattenColumns],
+  );
+  const colWidths = React.useMemo(
+    () => colsKeys.map(columnKey => colsWidths.get(columnKey)),
+    [colsKeys, colsWidths],
+  );

功能等价但更易读,也避免了手工 join 依赖的潜在问题;如果后续 profiling 发现确有性能差异,再针对性优化即可。

Also applies to: 447-456, 915-916, 971-977, 980-980


874-935: TableContext 新增字段及依赖基本正确,可顺手清理一些小瑕疵

TableContextValue 中新增的 onColumnWidthChangecolsWidthscolsKeyscolWidthsonColumnResizeEndonResizingChangefullTableRef 等都已经同时出现在 value 和依赖列表中,能保证消费方在列宽/拖拽状态变化时正确更新。结合之前关于 context 依赖必须与字段保持同步的经验来看,这里整体是对的。Based on learnings, 这一点非常重要。

有两点可以顺便打磨下:

  1. 依赖数组里 colWidths 出现了两次(行 977 和 980),虽然完全无害,但会迷惑后续维护者。
  2. fullTableRef 本身是一个稳定的 ref 对象,把它放进 useMemo 依赖不会带来问题,但也不会随着 .current 的变化而重新计算 context;如果只是为了把 ref 传下去,其实可以不放在依赖列表里,让依赖更聚焦于真正决定渲染的数据/配置。

可以在不改变行为的前提下,把重复和不必要的依赖精简掉,使这一块更干净一些。

Also applies to: 936-996

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 97dbe88 and 454fb50.

📒 Files selected for processing (4)
  • README.md (1 hunks)
  • package.json (0 hunks)
  • src/Table.tsx (9 hunks)
  • src/VirtualTable/BodyGrid.tsx (3 hunks)
💤 Files with no reviewable changes (1)
  • package.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • README.md
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-11-08T12:53:09.293Z
Learnt from: bbb169
Repo: react-component/table PR: 1202
File: src/Table.tsx:903-904
Timestamp: 2024-11-08T12:53:09.293Z
Learning: 在 `src/Table.tsx` 文件的 React 组件 `Table` 中,即使 `bodyScrollLeft` 频繁更新,也需要在 `TableContextValue` 的 `useMemo` 依赖数组中包含 `bodyScrollLeft` 和 `headerCellRefs`,因为每次滚动时重新计算 `TableContextValue` 是解决该问题所必须的。

Applied to files:

  • src/VirtualTable/BodyGrid.tsx
  • src/Table.tsx
🧬 Code graph analysis (1)
src/Table.tsx (2)
src/interface.ts (1)
  • Key (21-21)
src/utils/valueUtil.tsx (1)
  • getColumnsKey (17-34)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test / react component workflow
🔇 Additional comments (2)
src/Table.tsx (2)

140-145: onColumnResizeEnd 的 API 设计合理,透传链路清晰

onColumnResizeEnd 暴露 { columnKey, width, columnWidths } 这一结构基本能覆盖调用方需求,并且已经在 props 解构和 TableContext 中完整透传,看起来自洽,没有明显边界问题。和内部的 onColumnWidthChange 职责区分也比较清晰。

Also applies to: 240-243, 932-933, 978-978


392-393: isResizing 状态与样式联动实现合理

新增的 isResizing 状态通过 onResizingChange: setIsResizing 暴露到上下文,同时在根节点上加上 ${prefixCls}-column-resizing class,用于在拖拽中控制样式/交互,这是一个简单直接的设计,状态来源和消费方都清晰,没有发现逻辑问题。

Also applies to: 837-838, 933-934, 979-979

@yoyo837
Copy link
Member

yoyo837 commented Dec 5, 2025

Sorry for delay.

We have plans for a major refactor of the Table component to enable better feature extensibility. Merging this PR now may introduce additional complexity to that refactor, so we would prefer to add this functionality after the refactor is completed. Unfortunately, we haven’t been able to secure time to work on the refactor yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.